// function* generatorFn() {
//   // 生成器函数
//   console.log('start');
//   return 'cuifan'
// }

// let generatorFnObj = generatorFn() // 生成器对象
//   // console.log(generatorFn);
// console.log(generatorFnObj);
// console.log(generatorFnObj.next());
// console.log(generatorFnObj === generatorFnObj[Symbol.iterator]());

// function* generatorFn() {
//   yield 'cufian'
//   yield 'cufian1'
//   yield 'cufian2'
//   return 'cuifan3'
// }

// let generatorFnObj = generatorFn()
// console.log(generatorFnObj.next());
// console.log(generatorFnObj.next());
// console.log(generatorFnObj.next());
// console.log(generatorFnObj.next());

// let generatorFnObj1 = generatorFn()
// let generatorFnObj2 = generatorFn()
// console.log(generatorFnObj1.next());
// console.log(generatorFnObj2.next());
// console.log(generatorFnObj1.next());
// console.log(generatorFnObj2.next());

// for (let x of generatorFnObj) {
//   console.log(x);
// }

// function* generatorFn(n) {
//   // 迭代指定的次数
//   for (let i = 0; i < n; i++) {
//     yield i
//   }
//   return 'cuifan'
// }

// let generatorFnObj = generatorFn(4)
// for (let i of generatorFnObj) {
//   console.log(i);
// }


// 根据配置的值指定迭代的次数
// function* nTimes(n) {
//   for (let i = 0; i < n; i++) {
//     yield i
//   }
// }


// function* nTimes(n, m) {
//   for (let i = n; i < m; i++) {
//     yield i
//   }
// }

// for (let i of nTimes(5, 7)) {
//   console.log(i);
// }

// 生成器做默认迭代器
// class Foo {
//   constructor() {
//     this.values = [1, 2, 3, 4]
//   }

//   *
//   [Symbol.iterator]() {
//     yield* this.values
//   }
// }

// let foo = new Foo()

// for (let i of foo) {
//   console.log(i);
// }

// function* generatorFn() {
//   yield*[1, 2, 3, 4]
// }

// let g = generatorFn()
// console.log(g)
// console.log(g.next());
// console.log(g.next());
// console.log(g.return(4));
// console.log(g.next());

// let arr = [1, 2, 3, 4]
// let iter = arr[Symbol.iterator]()
// for (let i of iter) {
//   console.log(i);
// }